#include "phase.h"
#include "main.h"
#include "sys.h"

const static float kPhaseStep[] = {1.4f, 2.8f, 5.6f, 11.2f, 22.5f, 45.0f, 90.0f, 180.0f};

float Phase_Write(uint16_t phase)
{
    float degree = 0;
    HAL_GPIO_WritePin(PE_LE_GPIO_Port, PE_LE_Pin, GPIO_PIN_RESET);
    taskENTER_CRITICAL();
    for (uint8_t i = 0; i < 13; i++)
    {
        HAL_GPIO_WritePin(PE_SCK_GPIO_Port, PE_SCK_Pin, GPIO_PIN_RESET);

        if (BIT_READ(phase, i))
        {
            if (i < sizeof(kPhaseStep) / sizeof(float))
                degree += kPhaseStep[i];
            HAL_GPIO_WritePin(PE_SDA_GPIO_Port, PE_SDA_Pin, GPIO_PIN_SET);
        }
        else
        {
            HAL_GPIO_WritePin(PE_SDA_GPIO_Port, PE_SDA_Pin, GPIO_PIN_RESET);
        }
        delay_us(1);
        HAL_GPIO_WritePin(PE_SCK_GPIO_Port, PE_SCK_Pin, GPIO_PIN_SET);
        delay_us(1);
    }
    HAL_GPIO_WritePin(PE_LE_GPIO_Port, PE_LE_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(PE_SCK_GPIO_Port, PE_SCK_Pin, GPIO_PIN_RESET);
    delay_us(1);
    taskEXIT_CRITICAL();
    return degree;
}